﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _36虚方法
{
    class Program
    {
        static void Main(string[] args)
        {
            //Base b = new Base();
            //b.Run();
            //b.Say();

            //Sub s = new Sub();
            //s.Run();
            //s.Say();

            //父类对象调用子类实例，这是面向对象的三大特性之一的: 多态 : 父类指针指向子类对象
            //父类可以调用子类
            Base b1 = new Sub();
            b1.Run();
            b1.Say();
            //子类不能调用父类  下面是错误写法
            //Sub s = new Base();

            Console.ReadKey();
        }
    }

    class Base
    {
        //虚方法
        public virtual void Run()
        {
            Console.WriteLine("父类-----Base");
        }
        
        //普通方法
        public void Say()
        {
            Console.WriteLine("Base--父类--Say");
        }
    }

    class Sub : Base
    {
        //重写虚方法
        public override void Run()//override 重写，代表原来的方法不存在
        {
            //base.Run();
            Console.WriteLine("Sub----子类");
        }

        //子类中使用 new 关键字用来隐藏父类中的同名方法
        public new void Say()//new 代表隐藏父类的方法，但父类的方法是存在的的
        {
            //base.Say();
            Console.WriteLine("Sub--子类--Say");
        }
    }
}
